From f2d751095699f43034411e47f7db5d3bc11fc170 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Fri, 16 May 2025 17:24:48 +0200 Subject: [PATCH] status/brightness: Port to new MetaBacklight API Mutter has taken over controlling the backlights of the system from gnome-settings-daemon. It now exposes MetaMonitors which can be reached from MetaMonitorManager, and any of the MetaMonitors can have a controllable backlight. For now, we keep the current UX and simply set the backlight percentage of the primary monitor's backlight (or the first monitor's backlight, if the primary monitor doesn't have a backlight) on all monitors. g-s-d is still responsible for reacting to keyboard shortcuts and popping up the OSD notification, but that might change in the future. The UI may change to make it possible to control individual backlights in the future. Part-of: --- .gitlab-ci.yml | 2 +- .../org.gnome.SettingsDaemon.Power.Screen.xml | 5 -- .../gnome-shell-dbus-interfaces.gresource.xml | 1 - js/ui/status/brightness.js | 76 ++++++++++++------- 4 files changed, 51 insertions(+), 33 deletions(-) delete mode 100644 data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3db275ff3..ed4684df2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -40,7 +40,7 @@ default: image: $MUTTER_CI_IMAGE variables: - MUTTER_CI_IMAGE: registry.gitlab.gnome.org/gnome/mutter/fedora/42:x86_64-2025-05-16.0 + MUTTER_CI_IMAGE: registry.gitlab.gnome.org/gnome/mutter/fedora/42:x86_64-2025-06-05.umockdev FDO_UPSTREAM_REPO: GNOME/gnome-shell BUNDLE: "extensions-git.flatpak" LINT_LOG: "eslint-report.xml" diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml deleted file mode 100644 index 05e4b8dc0..000000000 --- a/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/data/gnome-shell-dbus-interfaces.gresource.xml b/data/gnome-shell-dbus-interfaces.gresource.xml index 586d85be6..5005aa58d 100644 --- a/data/gnome-shell-dbus-interfaces.gresource.xml +++ b/data/gnome-shell-dbus-interfaces.gresource.xml @@ -38,7 +38,6 @@ org.gnome.SessionManager.xml org.gnome.SettingsDaemon.Color.xml org.gnome.SettingsDaemon.Power.Keyboard.xml - org.gnome.SettingsDaemon.Power.Screen.xml org.gnome.SettingsDaemon.Rfkill.xml org.gnome.SettingsDaemon.Wacom.xml org.gnome.Shell.AudioDeviceSelection.xml diff --git a/js/ui/status/brightness.js b/js/ui/status/brightness.js index ed6639460..d1642f109 100644 --- a/js/ui/status/brightness.js +++ b/js/ui/status/brightness.js @@ -1,16 +1,7 @@ -import Gio from 'gi://Gio'; import GObject from 'gi://GObject'; import {QuickSlider, SystemIndicator} from '../quickSettings.js'; -import {loadInterfaceXML} from '../../misc/fileUtils.js'; - -const BUS_NAME = 'org.gnome.SettingsDaemon.Power'; -const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power'; - -const BrightnessInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Power.Screen'); -const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface); - const BrightnessItem = GObject.registerClass( class BrightnessItem extends QuickSlider { _init() { @@ -18,23 +9,19 @@ class BrightnessItem extends QuickSlider { iconName: 'display-brightness-symbolic', }); - this._proxy = new BrightnessProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, - (proxy, error) => { - if (error) - console.error(error.message); - else - this._proxy.connect('g-properties-changed', () => this._sync()); - this._sync(); - }); + this.slider.accessible_name = _('Brightness'); + + const monitorManager = global.backend.get_monitor_manager(); + monitorManager.connectObject('monitors-changed', + this._monitorsChanged.bind(this), this); + this._monitorsChanged(); this._sliderChangedId = this.slider.connect('notify::value', this._sliderChanged.bind(this)); - this.slider.accessible_name = _('Brightness'); } _sliderChanged() { - const percent = this.slider.value * 100; - this._proxy.Brightness = percent; + this._setBrightness(this.slider.value); } _changeSlider(value) { @@ -43,12 +30,49 @@ class BrightnessItem extends QuickSlider { this.slider.unblock_signal_handler(this._sliderChangedId); } - _sync() { - const brightness = this._proxy.Brightness; - const visible = Number.isInteger(brightness) && brightness >= 0; - this.visible = visible; - if (visible) - this._changeSlider(this._proxy.Brightness / 100.0); + _setBrightness(brightness) { + this._primaryBacklight?.block_signal_handler(this._brightnessChangedId); + this._monitors.forEach(monitor => { + const backlight = monitor.get_backlight(); + const {brightnessMin: min, brightnessMax: max} = backlight; + backlight.brightness = min + ((max - min) * brightness); + }); + this._primaryBacklight?.unblock_signal_handler(this._brightnessChangedId); + + this._changeSlider(brightness); + } + + _primaryBacklightChanged() { + const {brightness, brightnessMin: min, brightnessMax: max} = + this._primaryBacklight; + const target = (brightness - min) / (max - min); + this._setBrightness(target); + } + + _setPrimaryBacklight(backlight) { + if (this._primaryBacklight) { + this._primaryBacklight.disconnect(this._brightnessChangedId); + this._brightnessChangedId = 0; + } + + this._primaryBacklight = backlight; + this.visible = !!backlight; + + if (this._primaryBacklight) { + this._brightnessChangedId = + this._primaryBacklight.connect('notify::brightness', + this._primaryBacklightChanged.bind(this)); + this._primaryBacklightChanged(); + } + } + + _monitorsChanged() { + this._monitors = global.backend.get_monitor_manager() + .get_monitors() + .filter(m => m.get_backlight() && m.is_active()); + const primary = this._monitors.find(m => m.is_primary()) || + this._monitors[0]; + this._setPrimaryBacklight(primary?.get_backlight()); } }); -- 2.39.5